package br.com.Bolao.application.controller.jogos;

import br.com.Bolao.application.controller.BaseController;
import br.com.Bolao.application.controller.usuarios.UsuarioService;
import br.com.Bolao.application.dao.jogos.JogoDAO;
import br.com.Bolao.model.Jogo;
import java.util.Date;
import java.util.List;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.FlushModeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

/**
 * Controller da página CADASTRO_RESULTADO.XHTML
 * @author frederico.cruz
 */
@Scope(ScopeType.CONVERSATION)
@Name("jogosAction")
public class JogosController extends BaseController {

    @In
    private JogoDAO jogoDAO;
    private Integer paramGolsTime1;
    private Integer paramGolsTime2;
    private Date paramDataInicioCopa;
    private DataModel listaJogos;
    @In
    private UsuarioService usuarioService;

    public void setListaJogos(DataModel listaJogos) {
        this.listaJogos = listaJogos;
    }

    public DataModel getListaJogos() {
        return listaJogos = new ListDataModel(jogoDAO.obterTodos());
    }

    public void setDataLimite() {
        try {
            List<Jogo> listaTotalJogos = jogoDAO.obterTodos();
            for (Jogo jogo : listaTotalJogos) {
                if (jogo.isMarcacaoLimite()) {
                    continue;
                } else {
                    jogo.setDataLimite(paramDataInicioCopa);
                    jogo.setMarcacaoLimite(true);
                    jogoDAO.salvar(jogo);
                }
            }
            adicionarMensagemInformacao("Data limite definida");
        } catch (Exception e) {
            adicionarMensagemErro("Não foi possível definir a data limite "+e.getMessage());
        }
    }

    @Begin(flushMode = FlushModeType.MANUAL, nested = true)
    public String setup() {
        paramGolsTime1 = null;
        paramGolsTime2 = null;
        return "apostar";
    }

    /**
     * Método que cadastra o resultado de um jogo.
     * @param jogo
     */
    @End
    public void cadastroResultado(Jogo jogo) {
        try {
            /**
             * Validação se os campos estão preenchidos corretamente
             */
            if (jogo.getGolsTime1() == null || jogo.getGolsTime1() == null) {
                throw new Exception("Preencha os campos corretamente!");
            }
            /**
             * Seta quem foi o vencedor do jogo ou caso seja empate o campos será
             * setado com o valor 0(zero).
             */
            if (jogo.getGolsTime1() > jogo.getGolsTime2()) {
                jogo.setResultado(jogo.getTime1().getIdEquipe());
            } else if (jogo.getGolsTime1() < jogo.getGolsTime2()) {
                jogo.setResultado(jogo.getTime2().getIdEquipe());
            } else {
                jogo.setResultado(0);
            }
            jogoDAO.atualizar(jogo);
            adicionarMensagemInformacao("Resultado marcado com sucesso!");
        } catch (Exception e) {
            adicionarMensagemErro("Não foi possível marcar resultado no jogo!" + e + "Entre em contato com mbsolutions@gmail.com");
        }
    }

    public Integer getParamGolsTime1() {
        return paramGolsTime1;
    }

    public void setParamGolsTime1(Integer paramGolsTime1) {
        this.paramGolsTime1 = paramGolsTime1;
    }

    public Integer getParamGolsTime2() {
        return paramGolsTime2;
    }

    public void setParamGolsTime2(Integer paramGolsTime2) {
        this.paramGolsTime2 = paramGolsTime2;
    }

    public Date getParamDataInicioCopa() {
        return paramDataInicioCopa;
    }

    public void setParamDataInicioCopa(Date paramDataInicioCopa) {
        this.paramDataInicioCopa = paramDataInicioCopa;
    }
}
